/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.gael.consultermenu.services.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.gael.consultermenu.om.IGroupe;
import fr.generali.accueilclient.gael.consultermenu.om.IMenu;
import fr.generali.accueilclient.gael.consultermenu.om.IParametre;
import fr.generali.accueilclient.gael.consultermenu.om.IUtilisateurMenu;
import fr.generali.accueilclient.gael.consultermenu.om.impl.DTOGroupe;
import fr.generali.accueilclient.gael.consultermenu.om.impl.DTOMenu;
import fr.generali.accueilclient.gael.consultermenu.om.impl.DTOParametre;
import fr.generali.accueilclient.utils.spel.mapping.support.MapperBuilder;
import fr.generali.accueilclient.utils.spel.mapping.support.MapperFactory;
import fr.generali.gael.habilitations.consultermenu.DtoGroupe;
import fr.generali.gael.habilitations.consultermenu.DtoMenu;
import fr.generali.gael.habilitations.consultermenu.DtoParametre;
import fr.generali.gael.habilitations.consultermenu.DtoUtilisateurMenu;

/**
 * @author Holmes Kelly
 */
@Component("consulterMenuListeProduitsMapper")
public class ConsulterMenuListeProduitsMapper {

    /**
     * @param utilisateurMenu utilisateur menu
     * @return DtoUtilisateurMenu
     */
    public DtoUtilisateurMenu mapperUtilisateurMenu2DtoUtilisateurMenu(IUtilisateurMenu utilisateurMenu) {

        DtoUtilisateurMenu dtoUtilisateurMenu = null;

        if (utilisateurMenu != null) {

            dtoUtilisateurMenu = new DtoUtilisateurMenu();

            MapperBuilder<IUtilisateurMenu, DtoUtilisateurMenu> buildUtilisateurMenu =
                            MapperFactory.mapperBuilder(IUtilisateurMenu.class, DtoUtilisateurMenu.class);

            buildUtilisateurMenu.getMapper().map(utilisateurMenu, dtoUtilisateurMenu);
        }

        return dtoUtilisateurMenu;
    }

    /**
     * @param dtoGroupe dtoGroupe
     * @return IGroupe
     */
    public IGroupe mapperDtoGroupe2Groupe(DtoGroupe dtoGroupe) {

        IGroupe groupe = null;

        if (dtoGroupe != null) {

            groupe = new DTOGroupe();
            groupe.setGroupeId(dtoGroupe.getGroupeId());
            groupe.setLibellePortail(dtoGroupe.getLibellePortail());
            groupe.setMenuses(buildConverterListeMenu().convert(dtoGroupe.getMenuses()));
            groupe.setSousGroupes(buildConverterListeGroupe().convert(dtoGroupe.getSousGroupes()));
        }

        return groupe;
    }

    /**
     * @return converter liste groupes
     */
    private Converter<List<DtoGroupe>, List<IGroupe>> buildConverterListeGroupe() {

        Converter<List<DtoGroupe>, List<IGroupe>> converter = new Converter<List<DtoGroupe>, List<IGroupe>>() {

            @Override
            public List<IGroupe> convert(List<DtoGroupe> source) {

                List<IGroupe> listeGroupe = new ArrayList<IGroupe>(0);
                CollectionUtils.collect(source, getTransformerGroupe(), listeGroupe);
                return listeGroupe;
            }
        };

        return converter;
    }

    /**
     * @return transformer groupe
     */
    private Transformer getTransformerGroupe() {

        Transformer transformer = new Transformer() {

            @Override
            public Object transform(Object input) {

                DtoGroupe dtoGroupe = DtoGroupe.class.cast(input);
                IGroupe groupe = new DTOGroupe();
                groupe.setGroupeId(dtoGroupe.getGroupeId());
                groupe.setLibellePortail(dtoGroupe.getLibellePortail());
                groupe.setMenuses(buildConverterListeMenu().convert(dtoGroupe.getMenuses()));
                groupe.setSousGroupes(buildConverterListeGroupe().convert(dtoGroupe.getSousGroupes()));

                return groupe;
            }
        };

        return transformer;
    }

    /**
     * @return converter liste menu
     */
    private Converter<List<DtoMenu>, List<IMenu>> buildConverterListeMenu() {

        Converter<List<DtoMenu>, List<IMenu>> converter = new Converter<List<DtoMenu>, List<IMenu>>() {

            @Override
            public List<IMenu> convert(List<DtoMenu> source) {

                List<IMenu> listeMenu = new ArrayList<IMenu>(0);
                CollectionUtils.collect(source, getTransformerMenu(), listeMenu);
                return listeMenu;
            }
        };

        return converter;
    }

    /**
     * @return transformer menu
     */
    private Transformer getTransformerMenu() {

        Transformer transformer = new Transformer() {

            @Override
            public Object transform(Object input) {

                DtoMenu dtoMenu = DtoMenu.class.cast(input);

                IMenu menu = new DTOMenu();
                menu.setLibellePortail(dtoMenu.getLibellePortail());
                menu.setMenuId(dtoMenu.getMenuId());
                menu.setParametres(buildConverterParametre().convert(dtoMenu.getParametres()));
                menu.setUrl(dtoMenu.getUrl());

                return menu;
            }
        };

        return transformer;
    }

    /**
     * @return liste parametres
     */
    private Converter<List<DtoParametre>, List<IParametre>> buildConverterParametre() {

        Converter<List<DtoParametre>, List<IParametre>> converter =
                        new Converter<List<DtoParametre>, List<IParametre>>() {

                            @Override
                            public List<IParametre> convert(List<DtoParametre> source) {

                                List<IParametre> listeParametre = new ArrayList<IParametre>(0);
                                CollectionUtils.collect(source, getTransformerParametre(), listeParametre);
                                return listeParametre;
                            }
                        };

        return converter;
    }

    /**
     * @return transformer parametre
     */
    private Transformer getTransformerParametre() {

        Transformer transformer = new Transformer() {

            @Override
            public Object transform(Object input) {

                DtoParametre dtoParametre = DtoParametre.class.cast(input);

                IParametre parametre = new DTOParametre();
                parametre.setCodeValeurParDefaut(dtoParametre.getCodeValeurParDefaut());
                parametre.setNomParametreURL(dtoParametre.getNomParametreURL());
                parametre.setParametreId(dtoParametre.getParametreId());
                parametre.setValeurParDefaut(dtoParametre.getValeurParDefaut());
                return parametre;
            }
        };

        return transformer;
    }

}
